import scala.collection.{immutable, mutable}

object Demo16Map {
  def main(args: Array[String]): Unit = {
    /**
     * Map
     * 特点：每个元素都是K-V格式的，可以通过K获取V、不可变、无序的
     */
    val kvMap: Map[String, Int] = Map[String, Int](("k1", 1), ("k2", 2), "k3" -> 3)

    // 通过K获取V
    /**
     * Option类型：有两个子类 分别为：Some、None
     * 因为在Map中通过Key获取Value，Key有时候是不存在的
     * 在Java中如果应该Key不存在 在Map中查询时则会报错
     * 所以在Scala中存在一些 “模棱两可”（有时能获取到值 有时获取不到） 的情况
     * 可以返回Option 表示方法的调用者要注意能不能真正获取到值
     */
    val maybeInt: Option[Int] = kvMap.get("k2")
    println(maybeInt)

    val maybeInt1: Option[Int] = kvMap.get("kk2")
    println(maybeInt1)

    val value: Any = kvMap.getOrElse("k3", "没有获取到则返回默认值")
    println(value)

    val value1: Any = kvMap.getOrElse("kk3", "没有获取到则返回默认值")
    println(value1)

    // 将k对应的v做一个次方
    // 如果map方法中的函数f 返回的是一个二元组 那么最后map方法会返回一个新的Map
    val newMap: Map[String, Double] = kvMap.map(kv => (kv._1, Math.pow(kv._2, 3)))
    println(newMap)
    // 如果map方法中的函数f 返回的是一个字符串 那么最后map方法会返回一个新的Iterable类型
    /**
     * Iterable类型同List类型的区别？
     *
     */
    val newMap1: immutable.Iterable[String] = kvMap.map(kv => kv._1 + "," + Math.pow(kv._2, 3))
    println(newMap1)

    println(kvMap.keys) // 返回所有的key
    println(kvMap.values) // 返回所有的value
    println(kvMap.contains("k1")) // 判断key存不存在
    println(kvMap.contains("kk1"))

    // 可变的Map
    val hashMap: mutable.HashMap[String, Int] = mutable.HashMap[String, Int](("k1", 1), "k2" -> 2, Tuple2("k3", 3))
    println(hashMap)

    hashMap.+=(("k4", 4), ("k5", 5))
    println(hashMap)

    hashMap.-=("k1", "k2")
    println(hashMap)

  }

}
